#include"SmartPtr.h"
using namespace cfy;
int div()
{
	int a, b;
	cin >> a >> b;
	if (b == 0)
		throw invalid_argument("除0错误");

	return a / b;
}

template<class T>
class SmartPtr
{
public:
	//RAII
	//保存资源
	SmartPtr(T* ptr)
		:_ptr(ptr)
	{}
	//释放资源
	~SmartPtr()
	{
		delete[] _ptr;
		cout << _ptr << endl;
	}
	//像指针一样
	T& operator*()
	{
		return *_ptr;
	}

	T& operator[](size_t pos)
	{
		return _ptr[pos];
	}
private:
	T* _ptr;
};

void Func()
{
	SmartPtr<int> sp1(new int[10]);
	SmartPtr<int> sp2(new int[20]);
	*sp1 = 10;
	sp1[0]--;
	cout << *sp1 << endl;
	cout << div() << endl;
}

// int main()
// {
// 	try
// 	{
// 		Func();
// 	}
// 	catch (exception& e)
// 	{
// 		cout << e.what() << endl;
// 	}

// 	return 0;
// }

//int main()
//{
//	cfy::auto_ptr<int> ap1(new int);
//	cfy::auto_ptr<int> ap2 = ap1;
//	(*ap1)++;
//	(*ap2)++;
//
//	return 0;
//}


//int main()
//{
//	cfy::shared_ptr<int> sp1(new int(1));
//	cfy::shared_ptr<int> sp2(sp1);
//	*sp1 = 10;
//	*sp2 = 20;
//	cout << sp1.use_count() << endl; //2
//
//	cfy::shared_ptr<int> sp3(new int(1));
//	cfy::shared_ptr<int> sp4(new int(2));
//	sp3 = sp4;
//	cout << sp3.use_count() << endl; //2
//	return 0;
//}
void func(cfy::shared_ptr<int>& sp, size_t n)
{
	for (size_t i = 0; i < n; i++)
	{
		cfy::shared_ptr<int> copy(sp);
	}
}
//int main()
//{
//	cfy::shared_ptr<int> p(new int(0));
//	const size_t n = 1000;
//	thread t1(func, p, n);
//	thread t2(func, p, n);
//	t1.join();
//	t2.join();
//	cout << p.use_count() << endl;//预期：1
//	return 0;
//}

template<class T>
struct DelArr
{
	void operator()(const T* ptr)
	{
		cout << "delete[]: " << ptr << endl;
		delete[] ptr;
	}
};
//int main()
//{
//	//仿函数示例
//	cfy::shared_ptr<ListNode, DelArr<ListNode>> sp1(new ListNode[10], DelArr<ListNode>());
//
//	//lambda示例1
//	cfy::shared_ptr<FILE, function<void(FILE*)>> sp2(fopen("test.cpp", "r"), [](FILE* ptr) {
//		cout << "fclose: " << ptr << endl;
//		fclose(ptr);
//		});
//
//	//lambda示例2
//	auto f = [](FILE* ptr) {
//		cout << "fclose: " << ptr << endl;
//		fclose(ptr);
//	};
//	cfy::shared_ptr<FILE, decltype(f)> sp3(fopen("test.cpp", "r"), f);
//
//	return 0;
//}
